import { PipeTransform, ArgumentMetadata, BadRequestException } from '@nestjs/common';
import { ZodError, ZodType } from 'zod';
/**
 * 自定义 Zod 校验管道
 * 使用举例：@UsePipes(new ZodValidationPipe(createCatSchema))
 * 会在控制器方法执行前先对入参做 Zod 校验，不通过则抛出 BadRequestException
 */
export class ZodValidationPipe implements PipeTransform {
	private readonly schema: ZodType;

	constructor(schema: ZodType) {
		this.schema = schema;
	}

	/**
	 * @param value     原始请求参数（body/query/param 等）
	 * @param _metadata Nest 提供的额外参数信息，此处无需使用仅为实现接口
	 */
	transform(value: unknown, _metadata: ArgumentMetadata) {
		try {
			console.log('🔍 Zod 校验中，入参：', value);
			console.log('🔍 Zod 校验中，入参：', _metadata);

			// schema.parse 会在校验通过时返回格式化后的数据，否则抛出 ZodError
			return this.schema.parse(value);
		} catch (error) {
			if (error instanceof ZodError) {
				throw new BadRequestException({
					message: '参数校验失败',
					errors: error.issues,
				});
			}

			// 如果不是 ZodError，继续抛出原始错误，方便上层定位
			throw error;
		}
	}
}
